/**
 * 请假流程任务办理
 */
$(function() {

			// 签收
			$('.claim').button({
						icons : {
							primary : 'ui-icon-person'
						}
					});

			// 办理
			$('.handle').button({
						icons : {
							primary : 'ui-icon-comment'
						}
					}).click(handle);

			// 跟踪
			$('.trace').click(graphTrace);

		});

// 用于保存加载的详细信息
var detail = {};

/**
 * 加载详细信息
 * 
 * @param {Object}
 *            id
 */
function loadDetail(id, withVars, callback) {
	var dialog = this;
	$.getJSON(ctx + '/oa/leave/detail/' + id, function(data) {
		detail = data;
		$.each(data, function(k, v) {

					// 格式化日期
					if (k == 'applyTime' || k == 'startTime' || k == 'endTime') {
						$('.view-info td[name=' + k + ']', dialog)
								.text(new Date(v).format('yyyy-MM-dd hh:mm'));
					} else {
						$('.view-info td[name=' + k + ']', dialog).text(v);
					}

				});
		if ($.isFunction(callback)) {
			callback(data);
		}
	});
}

/**
 * 加载详细信息，同时读取流程任务变量
 * 
 * @param {Object}
 *            id
 */
function loadDetailWithTaskVars(leaveId, taskId, callback) {
	var dialog = this;
	$.getJSON(ctx + '/oa/leave/detail-with-vars/' + leaveId + "/" + taskId,
			function(data) {
				detail = data;
				$.each(data, function(k, v) {
					// 格式化日期
					if (k == 'applyTime' || k == 'startTime' || k == 'endTime') {
						$('.view-info td[name=' + k + ']', dialog)
								.text(new Date(v).format('yyyy-MM-dd hh:mm'));
					} else {
						$('.view-info td[name=' + k + ']', dialog).text(v);
					}
				});
				if ($.isFunction(callback)) {
					callback(data);
				}
			});
}

/**
 * 完成任务
 * 
 * @param {Object}
 *            taskId
 */
function complete(taskId, variables) {
	var dialog = this;

	// 转换JSON为字符串
	var keys = "", values = "", types = "";
	if (variables) {
		$.each(variables, function() {
					if (keys != "") {
						keys += ",";
						values += ",";
						types += ",";
					}
					keys += this.key;
					values += this.value;
					types += this.type;
				});
	}

	$.blockUI({
				message : '<h2><img src="'
						+ ctx
						+ '/images/ajax/loading.gif" align="absmiddle"/>正在提交请求……</h2>'
			});

	// 发送任务完成请求
	$.post(ctx + '/oa/leave/complete/' + taskId, {
				keys : keys,
				values : values,
				types : types
			}, function(resp) {
				$.unblockUI();
				if (resp == 'success') {
					alert('任务完成');
					location.reload();
				} else {
					alert('操作失败!');
				}
			});
}

/*
 * 使用json方式定义每个节点的按钮 以及按钮的功能
 * 
 * open:打开对话框的时候需要处理的任务 btns:对话框显示的按钮
 */
var handleOpts = {
	deptLeaderAudit : {
		width : 300,
		height : 300,
		open : function(id) {

			// 打开对话框的时候读取请假内容
			loadDetail.call(this, id);
		},
		btns : [{
					text : '同意',
					click : function() {
						var taskId = $(this).data('taskId');

						// 设置流程变量
						complete(taskId, [{
											key : 'deptLeaderPass',
											value : true,
											type : 'B'
										}]);
					}
				}, {
					text : '驳回',
					click : function() {
						var taskId = $(this).data('taskId');

						$('<div/>', {
							title : '填写驳回理由',
							html : "<textarea id='leaderBackReason' style='width: 250px; height: 60px;'></textarea>"
						}).dialog({
							modal : true,
							open : function() {

							},
							buttons : [{
								text : '驳回',
								click : function() {
									var leaderBackReason = $('#leaderBackReason')
											.val();
									if (leaderBackReason == '') {
										alert('请输入驳回理由！');
										return;
									}

									// 设置流程变量
									complete(taskId, [{
														key : 'deptLeaderPass',
														value : false,
														type : 'B'
													}, {
														key : 'leaderBackReason',
														value : leaderBackReason,
														type : 'S'
													}]);
								}
							}, {
								text : '取消',
								click : function() {
									$(this).dialog('close');
									$('#deptLeaderAudit').dialog('close');
								}
							}]
						});
					}
				}, {
					text : '取消',
					click : function() {
						$(this).dialog('close');
					}
				}]
	},
	hrAudit : {
		width : 300,
		height : 300,
		open : function(id) {
			// 打开对话框的时候读取请假内容
			loadDetail.call(this, id);
		},
		btns : [{
					text : '同意',
					click : function() {
						var taskId = $(this).data('taskId');

						// 设置流程变量
						complete(taskId, [{
											key : 'hrPass',
											value : true,
											type : 'B'
										}]);
					}
				}, {
					text : '驳回',
					click : function() {
						var taskId = $(this).data('taskId');

						$('<div/>', {
							title : '填写驳回理由',
							html : "<textarea id='hrBackReason' style='width: 250px; height: 60px;'></textarea>"
						}).dialog({
							modal : true,
							buttons : [{
								text : '驳回',
								click : function() {
									var hrBackReason = $('#hrBackReason').val();
									if (hrBackReason == '') {
										alert('请输入驳回理由！');
										return;
									}

									// 设置流程变量
									complete(taskId, [{
														key : 'hrPass',
														value : false,
														type : 'B'
													}, {
														key : 'hrBackReason',
														value : hrBackReason,
														type : 'S'
													}]);
								}
							}, {
								text : '取消',
								click : function() {
									$(this).dialog('close');
									$('#deptLeaderAudit').dialog('close');
								}
							}]
						});
					}
				}, {
					text : '取消',
					click : function() {
						$(this).dialog('close');
					}
				}]
	},
	modifyApply : {
		width : 500,
		height : 470,
		open : function(id, taskId) {
			var dialog = this;

			$('#startTime,#endTime', this).datetimepicker({
						stepMinute : 5
					});

			// 打开对话框的时候读取请假内容
			loadDetailWithTaskVars.call(this, id, taskId, function(data) {
						// 显示驳回理由
						$('.info').show().html("<b>领导：</b>"
								+ (data.variables.leaderBackReason || "")
								+ "<br/><b>HR：</b>"
								+ (data.variables.hrBackReason || ""));

						// 读取原请假信息
						$('#modifyApplyContent #leaveType option[value='
								+ data.leaveType + ']').attr('selected', true);
						$('#modifyApplyContent #startTime')
								.val(new Date(data.startTime)
										.format('yyyy-MM-dd hh:mm'));
						$('#modifyApplyContent #endTime')
								.val(new Date(data.endTime)
										.format('yyyy-MM-dd hh:mm'));
						$('#modifyApplyContent #reason').val(data.reason);
					});

			// 切换状态
			$("#radio").buttonset().change(function() {
						var type = $(':radio[name=reApply]:checked').val();
						if (type == 'true') {
							$('#modifyApplyContent').show();
						} else {
							$('#modifyApplyContent').hide();
						}
					});
		},
		btns : [{
			text : '提交',
			click : function() {
				var taskId = $(this).data('taskId');
				var reApply = $(':radio[name=reApply]:checked').val();

				// 提交的时候把变量
				complete(taskId, [{
									key : 'reApply',
									value : reApply,
									type : 'B'
								}, {
									key : 'leaveType',
									value : $('#modifyApplyContent #leaveType')
											.val(),
									type : 'S'
								}, {
									key : 'startTime',
									value : $('#modifyApplyContent #startTime')
											.val(),
									type : 'D'
								}, {
									key : 'endTime',
									value : $('#modifyApplyContent #endTime')
											.val(),
									type : 'D'
								}, {
									key : 'reason',
									value : $('#modifyApplyContent #reason')
											.val(),
									type : 'S'
								}]);
			}
		}, {
			text : '取消',
			click : function() {
				$(this).dialog('close');
			}
		}]
	},
	reportBack : {
		width : 400,
		height : 400,
		open : function(id, taskId) {
			// 打开对话框的时候读取请假内容
			loadDetail.call(this, id, taskId);
			$('#realityStartTime,#realityEndTime').datetimepicker({
						stepMinute : 5
					});
		},
		btns : [{
					text : '提交',
					click : function() {
						var realityStartTime = $('#realityStartTime').val();
						var realityEndTime = $('#realityEndTime').val();

						if (realityStartTime == '') {
							alert('请选择实际开始时间！');
							return;
						}

						if (realityEndTime == '') {
							alert('请选择实际结束时间！');
							return;
						}

						var taskId = $(this).data('taskId');
						complete(taskId, [{
											key : 'realityStartTime',
											value : realityStartTime,
											type : 'D'
										}, {
											key : 'realityEndTime',
											value : realityEndTime,
											type : 'D'
										}]);
					}
				}, {
					text : '取消',
					click : function() {
						$(this).dialog('close');
					}
				}]
	}
};

/**
 * 办理流程
 */
function handle() {
	// 当前节点的英文名称
	var tkey = $(this).attr('tkey');

	// 当前节点的中文名称
	var tname = $(this).attr('tname');

	// 请假记录ID
	var rowId = $(this).parents('tr').attr('id');

	// 任务ID
	var taskId = $(this).parents('tr').attr('tid');

	// 使用对应的模板
	$('#' + tkey).data({
				taskId : taskId
			}).dialog({
				title : '流程办理[' + tname + ']',
				modal : true,
				width : handleOpts[tkey].width,
				height : handleOpts[tkey].height,
				open : function() {
					handleOpts[tkey].open.call(this, rowId, taskId);
				},
				buttons : handleOpts[tkey].btns
			});
}

Date.prototype.format = function(format) {
	var o = {
		"M+" : this.getMonth() + 1, // month
		"d+" : this.getDate(), // day
		"h+" : this.getHours(), // hour
		"m+" : this.getMinutes(), // minute
		"s+" : this.getSeconds(), // second
		"q+" : Math.floor((this.getMonth() + 3) / 3), // quarter
		"S" : this.getMilliseconds()
		// millisecond
	}
	if (/(y+)/.test(format))
		format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4
						- RegExp.$1.length));
	for (var k in o)
		if (new RegExp("(" + k + ")").test(format))
			format = format.replace(RegExp.$1, RegExp.$1.length == 1
							? o[k]
							: ("00" + o[k]).substr(("" + o[k]).length));
	return format;
}